<!-- 
    <!-- 
    一.js的文件类型
        js写在哪里？
            1. 文件内部*****
                <script type="text/javascript">
                    js代码...
                </script>
            2. 文件形式*******
                <script src="文件的路径" type="text/javascript" charset="utf-8"></script>
                
            3. 标签内部【使用的非常少】
                <button onclick="alert('标签内部')">标签内部</button>
                <a href=”javascript:;” onclick=’写Javascript代码’></a>【使用的较多】
    二. js输出语句
            0. js注释
				// 		单行注释
				/**/	多行注释
				
			1. Javascript的输出
				1.1 alert()-----弹出一个对话框
				1.2 document.write("内容")----在浏览器中输出内容
				
				1.3 console.log("内容")-----在控制台输出内容
				1.4 console.debug（）------用于js调试bug
				1.5 console.dir（）------输出内容在控制台[函数、对象等结构]
    三.变量的结构
    	定义变量的语法结构：
				var 变量名  = “变量值”;
			
			布尔值：真假
				false	假
				true	真
        变量的使用：
				1. 定义变量之后可以赋值，可以在其他地方修改值
				2. 直接定义变量不赋值
					var 变量名；
					变量名=值

			注意事项：
				1. 注意区分大小写：Username和username是两个完全不一样的东西
				2. 定义变量的时候不能使用关键字，保留字
				3. 定义变量可以使用的符号： $  _  
				4. 千万不要使用数字开头
    四.数据类型
        基本数据类型：
			 number(数字)			数字
			 	整数--INT，小数 float
			 string(字符串)		带双引号["",'']的数据
			 	当字符串中有特殊字符的时候，需要使用转义字符 --- \ 【去掉特殊符号的特殊含义】
			 boolean(布尔型)		真(1)假(0)
			 undefined(未定义)	定义未赋值的变量，他的默认值	
			 null(空)			空的值
			
     引用类型：
            函数 数组 对象
			特殊数值：
				NaN(计算错误，类型转换失败)  not a number
					进行计算的时候出现，一般情况下都是变量未定义,数字与字符串 * / -
					
              	Infinity(除数为零时的计算结果)
    五.获取变量的数据类型：
				typeof
				语法格式：typeof 变量名||值
    六.类型转换
            1. 强制类型转换
				使用parseInt()和parseFloat()将一种类型的数据到数字类型.
	  				parseInt（变量名）：将变量转换为整数 把小数和不是 数字的部分去掉；字符串 必须前面是数字；********
				 	parseFloat(变量名)：将字符串转为小数  **********
				 	Number (变量名)：将变量转换为数字，只能纯数字构成字符串才可以转换
                        Number(true) 1
                        Number(false) 0
				 	Boolean(变量名)：转换为布尔值，true/false;
				 	String(变量名):转换为字符串；
			2. 自动转换
    七.运算符
            1.算术运算符： +   -   *   /  %   ++   -- 
				
			2.比较运算符：==   !=    >   >=   <   <=   ===(全等于)    !==(不全等于)
			3.条件运算符：(expr1) ? (expr2) : (expr3)，
				例如:  $v1 = $fs>60  ?  "及格"  :  "补考" ;  //则v1根据fs的值有两个情况
			4.逻辑运算符：&&（与）    ||（或）    ! (非)
			5.字符串运算符：+   
			6.赋值运算符： =   +=   -=   *=    /=    %=
    八.字符串运算符: +   拼接字符串||连接符
    九.赋值运算符
            =：赋值运算符
            +=：  a+=b      ->    a=a+b;
            -=:   a-=b      ->    a=a-b;
            *=:   a*=b      ->    a=a*b;
            /=：  a/=b      ->    a=a/b;
            %=:   a%=b      ->    a=a%b;     
    十.运算符优先级
                赋值优先级最低
                先乘除后加减
                优先级相同情况下,从左到右依次计算.
    十一.位运算
        概念:  
              1.位运算是针对十进制整数在二进制的基础上进行运算的. 即需要将十进制数转换成二进制之后才进行按对应的每位上值的运算.
              2.二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。
              3.二进制就是等于2时就要进位。
                    0=00000000
                    1=00000001
                    2=00000010
                    3=00000011
                    4=00000100
                    5=00000101
                    6=00000110
                    7=00000111
                    8=00001000
                    9=00001001
                    10=00001010
                    ……
                    求二进制数 1011+11的和：1110=14
              4.二进制的按位运算符：
                    &(与) 两个运算数相应的位都为1，结果为1，否则为0；
                    |(或) 两个运算数相应的位某一个为1，结果为1，否则为0；
                    ^(异或) 两个运算数相应的位某一个为1，结果为1,但不能同时都为1；
                    ~(非)  一元操作，按运算数所有位取反。

                    将0看作假(false)    将1看作真(true)

    1. 输入对话框
				语法：prompt("提示信息","默认值")
    2.条件语句
        2.1 if(条件表达式){
                //语句1
                //语句....
                }
        2.2 if(条件表达式){
                    //条件成立的需要执行的语句
                }else{
                    //不成立的需要执行的语句
                }
        2.3 语法结构：
                if(条件1){
                    //语句...
                //语句...
                }else if(条件2){
                    //语句...
                //语句...
                }else if(条件N){
                    //语句...
                //语句...
                }else{
                    //条件都不满足的语句
                }
                语法结构：
                if(条件1){
                    //语句...
                //语句...
                }else if(条件2){
                    //语句...
                //语句...
                }else if(条件N){
                    //语句...
                //语句...
                }

                else 不是必须的，根据功能选择是否使用。
                【注】如果条件有重合，最苛刻的条件放在最前面。
        2.4 switch语句
            switch(表达式){
                case 表达式1:
                    语句1;
                    break;
                case 表达式2:
                    语句2; ...
                    break;
                case 表达式n:
                    语句n;
                    break;
                default:
                    语句n+1;
                    break;
                }

                switch语句：“如果switch中的表达式等于case 后面的个值(value)，则执行后面的语句，截止break；或switch的右花括号（}）”。

                default:默认语句，如果switch中的表达式与case后面的值都不同等，那么默认执行default后面的语句，default不是必须的。

                break：关键字会导致代码执行流跳出switch语句。
        2.5 switch特点特点：
            （1）switch之后必须是case或者是default
            （2）break可以不要,但是后面的case就不在判断,直到遇到break或者switch语句执行完毕才结束
            （3）default可以出现在switch的任何位置.但还是其他没有匹配上才执行default；

        2.6 if语句和switch语句比较
            （1）switch是状态分支语句,switch中的状态值和case后的值作比较,成立才执行
            （2）if是条件分支,值判断if中的条件，条件中可以是范围.
            （3）if中条件可以是一个范围；
            （4）switch条件只能某个值判断；
    3. for循环语句
        3.1 for(初始化表达式;条件表达式;条件改变表达式){
            循环体
            }

            初始化表达式：记录循环的次数；
            条件表达式：判断是否执行循环，只有条件满足才进行循环；
            条件改变表达式：修改条件表达式中的变量；
            循环体：需要多次执行的语句；

            循环要素：
                1、记录循环次数；var i=0;
                2、循环的条件；	 i<10;
                3、修改循环条件表达式；i++;
                4、循环的语句；console.log(“i love you”)；
        3.2 while语句
            while(条件表达式){
                循环体语句
                }

                while：循环执行代码，如果while()条件表达式为真，将执行while花括号{}中的语句，直到条件不为真时，才会终止while运行。
        3.3 do while语句
            do{
                循环体
                }while(条件表达式);

                do while循环语句与while类似，在对条件表达式求值之前，循环体内的代码至少会被执行一次。
        3.4 嵌套循环
                外层for 控制行
                里层for 控制列
                【注】外面的循环每执行一次循环体就会重新执行。 所以说里面的循环要重新全部执行一次。
        3.5 死循环
        死循环：循环条件表达式永远为真，循环体语句一直执行，这种情况一定不要出现在你的代码中，后果自负；
            while(true){
            console.log(“浪”);
            }

            for(;;){
            console.log(“浪”);
            }
        3.6 终止循环语句
            （1）break: 跳出当前循环                    （已这个地方为结尾）
            （2）continue: 终止本次循环,继续下次循环.    （只跳过本章节）

    1. 函数的定义:
				方式1：
					function 函数名(){
						//功能代码块
					}
				方式2：
					var fn = function(){
						//功能代码块
					}
				
			函数调用：
				函数名()
			
			注意事项：
				函数名不能和变量名重名，重名会报错：fn is not a function
                函数其实也是一种复合数据类型（对象），所以把函数赋值给一个变量是可行的，与var abc =123这种赋值一样。
    2.函数参数:
				function fn(a,b){--------形参
					console.log(a+b)
				}
                fn(1,2)------实参
    3.函数没有给返回值的时候， 默认的返回值 -- undefined0
				
			3.2. 函数返回值
				function fn(a,b){
					var c = a*b;
					return c;
					//【注意】：return 后面代码不会在执行
				}
    4.全局变量 局部变量
                //全局变量
                    var a = 20;
                    function fn() {
                        //局部变量
                        var b = 10;
                        //1. 外部使用内部的变量
                        c = b;
                        //方式2 ,将变量挂载到顶层对象window上面
                        window.b1 = b;
        //				window.alert(1111)
			}
            全局变量：可以在任何地方使用
			局部变量：函数内部定义的变量就叫局部变量，只能在函数内部使用，外部不能使用
    5.系统函数
            String(值)：将值转换为字符串
            Number( 值)：将值转换为数字类型
            Boolean(值)： 将非布尔类型值转为布尔类型   0  “”  null转换为false  其余转换 为true
            parseInt (值)转为整数
            parseFloat(值)：转为小数类型
            isNaN(值)：判定 值 如果不是数字 返回为true 是数字返回为false
            eval(字符串): 将字符串转换为js代码进行执行；  通常用其制作js模板。
    6.变量的污染
			全局变量容易被污染---全局变量可以在函数内部去修改值
			var a = 1;//全局变量
			function  fn() {
				//使用的是全局变量
				//a = 10;
				
				//定义了一个局部变量
				var a = 10;
			}
			fn();
			console.log(a);
    7.递归：函数自己调用自己
			递归条件：
				递归必须要有出口；
				必须要递归点；
    8.参数类型：
				数据类型：    基本类型，number  string 。。。。
						复杂类型：function  array  object


1. 数组定义方式：
				方式1：var 变量名 = [值，值2，值3]||[]; 
				方式2：var 变量名= new Array(值，值，值)||new Array();
				
				注意：数组元素的索引值是从0开始计数
				
			2. 数组使用
				arr[索引值]
			
			3. 数组长度
				arr.length
			
			
			//方法一定有小括号，属性没有括号
			
			vue: var arr = [];
2.数组的增删改----基础版------------------
			1. 数组增加
				语法：arr[索引值] = "";
				
			2. 数组元素删除
				语法：delete 数组元素；-----【了解】
				注意：这种方式删除数组元素不够彻底，删除之后原来的元素值为空，但是还会占据一个数组的位置
				
			3. 修改数组元素的值
				语法：arr[索引值] = "";
			
			4. 查询数组元素的值
				arr[索引值]
3.数组遍历：
				方式1：
					for…in语法结构：
					for(var i in 数组变量){
					    var 元素变量 =  数组变量[i];
					}
				方式2：
					for(var i = 0;i<arr.length;i++){}
				方式3：
					arr.forEach(function(item,index){})
4.数组方法：
            1. concat()
				将所有的数组连接成一个数组
				语法：arr.concat(arr1,arr2......)
			2. join()
				将数组以特定的符号连接成字符串
				语法：arr.join("连接的符号")
				
			3. pop()
				删除最后一个元素，返回值为最后一个元素
				语法：arr.pop()
            	1. push
				向数组中添加新的元素，并且返回新数组的长度
				array.push(item1, item2, ..., itemX)//元素值可以是一个或多个
			4. reverse
				反转数组
				
			5. splice
				添加或删除数组元素
				语法：array.splice(index,howmany,item1,.....,itemX)
				arr.splice(0,2)//删除数组的元素，从索引值0开始，删除2个元素
				arr.splice(0,2,11,22,33)//删除数组的元素，从索引值0开始，删除2个元素,并且添加了元素11 22 33【使用很少】
			6. slice
				选取数组中的元素
				arr.slice(start,end) [start,end)不包括结束的元素
			7. unshift()
				向数组的开头添加元素
            8. 数组遍历之forEach
				array.forEach(function(item, index))
            9. indexOf()
				方法可返回数组中某个指定的元素位置，如果没有则返回-1
				语法：
					array.indexOf(item,start)
				
			10. lastIndexOf()
				查找元素是从后往前查找,元素没有出现，则该方法返回 -1。
				
			11. sort()
				语法：
					arr.sort(function(a,b){return b-a});//倒序数组的元素进行排序。

排序顺序可以是字母或数字，并按升序或降序。

默认排序顺序为按字母升序。
			
			12. toString()
				将数组变成字符串
				
			13. valueOf()
            返回 Array 对象的原始值。
5. 交换数组中两个索引上的值
				var a = 1;
				var b = 4;
				var c;


                
		-->
<!-- 
    1. 对象的定义：
				方式1：
					var obj = {
						语法：键值对
						键名：键值
						"name":"张三",
						"age":"18",
						"eat":funcion(){
							console.log("中午吃什么")
						}
					}
				方式2：
					var obj = new Object();
					obj.name = "李四";
					obj.run=funciotn(){console.log()}
			
			2. 对象的使用
				obj.属性
				obj.方法()
    2.方法中的this
				谁调用指向谁
				
				1.1 在普通函数中的this，指向window对象
    3.如何获取输入框的值
				1.1 必须获取输入框对象？
					var iput = document.getElementById("idname")
				1.2 输入框对象，属性，iput.value
    4.number.toFixed(num) 保留小数位后num位数
    5.      
            1. 创建日期对象：
				var date = new Date();
				var date = new Date(dateVal);dateVal是一个日期
			
			2. 获取年份你
				date.getFullYear()
			3. 获取月 0-11
				date.getMonth()
			4. 获取日
				date.getDate()
			5. 获取时
				date.getHours()
			6. 获取分
				date.getMinutes()
			7. 获取秒
				date.getSeconds()
			
			8. dateObject.toLocaleString() 将年月日时分秒转为字符串
			9. toLocaleDateString		年月日转为字符串
            10.时间戳：
				dateobject.getTime()
			
			
			(今天的时间戳-生日的时间戳) / (1000*60*60*24);
    
    6.字符串方法
            1. stringObject.charAt(index)
				表示字符串中的下标
			2. stringObject.indexOf(searchvalue,fromindex) 
				检索xx在字符串中的位置，如果没有返回-1
			3. stringObject.lastIndexOf(searchvalue,fromindex)
				从后往前检索xx在字符串中的位置，如果没有返回-1
			4. stringObject.replace(oldvalue,newvalue)
				oldvalue:原来的值，即将被替换的字符串
				newvalue：新的值
				替换之后返回一个新的字符串
                1. substr()  
				截取字符串
				string.substr(index,howmany);--在字符串中，从index开始截取howmany个字符串,返回你截取的字符串
				
			5. substring()   
				string.substring(start,end);从start开始截取，end结束[不包含end]，返回你截取的字符串
				
			6. stringObject.charCodeAt(索引值)
				返回一个Unicode编码 ，找不到返回为空
				
			7. String.fromCharCode()
				Unicode编码转为字符
				
			8. slice()	提取字符串的片断，并在新的字符串中返回被提取的部分。 ******
				string.slice(start,end);从start开始截取，end结束[不包含end]，返回你截取的字符串
				string.slice(1)---从索引值为1的地方截取到最后
				
			9. split()	把字符串分割为字符串数组。******
				string.split("符号")
				
			10. trim() ******
				去除字符串前后的空格
				
			11. toString() 返回字符串
			
			12. toLowerCase()   小写字母
			13. toUpperCase()   大写字母
    7.Math对象
            1. Math.PI  	圆周率
			2. Math.abs()	绝对值
			3. Math.ceil(x)	上舍入
			4. Math.floor(x)下舍入
			5. Math.max(x)	最大值  Math.min()最小值
			6. Math.pow(x,y) x的y次方
			7. Math.round(x)四舍五入
			8. Math.random()随机数
				任意随机数	
				通用公式：
			//任意范围的随机数：Math.floor(Math.random()*(max-min+1)+min);

 -->


<!--
    1. window 对象
        closed获取当前窗口是否关闭  【了解】
			2. close()关闭窗口 *******
			3. window.pageYOffset	滚动条距离顶部的距离 *******
			
			4. screenX	返回相对于屏幕窗口的x坐标【了解】
			5. screenY	返回相对于屏幕窗口的y坐标【了解】
    2. Window方法
        2.1 confirm()
				带有提示信息，有取消和确定按钮的对话框
        2.2 open() 打开一个新窗口
                    语法：
                        window.open(URL,name,specs,replace)
                        URL：新开窗口的链接
                        name：窗口打开的方式
                            _self - URL替换当前页面
                        specs：
                            height=pixels	窗口的高度。最小.值为100
                            width=pixels	窗口的宽度.最小.值为100
        2.3 print()
				打印当前页面？
                2. scrollTo()
                    scrollTo(x,y)
    5. 定时器
        5.1 setInterval()	按照指定的周期（以毫秒计）来调用函数或计算表达式。	
			
				以指定时间的周期来调用函数
				语法；
					setInterval(function(){
						//执行代码
					},time)
					time: 单位是毫秒
				
				时间案例：在网页输出一个动态的时间。
				
				需求：
					让页面中的小球动起来
					1. css必须给定位
					
        5.2. clearInterval()	取消由 setInterval() 设置的 timeID。				
        5.3. setTimeout()		在指定的毫秒数后调用函数或计算表达式。
            语法：
                setTimeout(function () {
                    代码
                },time);
                time: 毫秒                            
        5.4. clearTimeout()	取消由 setTimeout() 方法设置的 timeID。
        5.5 css 中设置样式：
				元素对象.style.样式名 = 值；
	6.操作DOM
        6.1. 鼠标移入，移除事件
            onmouseover
            onmouseout
        6.2. 标签的属性值设置和获取
            设置：this.src = "路径"
            获取：this.src
    7.访问HTML元素方法
        1.1 document.getElementById();
            使用id访问元素
            
        1.2 getElementsByTagName()  ----返回一个数组集合
            使用标签名访问元素
            
        1.3 getElementsByName() ----返回一个数组集合
            使用name访问元素----主要是针对表单
            
        1.4 getElementsByClassName() ----返回一个数组集合
            使用类名来访问元素
    8. 选择器访问
        8.1     document.querySelector(“选择器”);//返回页面中的第一个元素 ----- 【了解】
                    选择器----相当于是css中的选择器写法
                    document.querySelector(“#名”)-----只适合id选择器
                
        8.2.    document.querySelectorAll(“选择器”);//返回页面中所有匹配的元素---返回值为数组
    9.表单方法
        9.1. submit() 
            表单提交方法
        9.2. 表单提交事件
            onsubmit 表单提交之前做什么事情，表单验证
    10 属性操作
            10.1. 操作属性名和默认属性值相同的属性.
				如:checked（一般指单选或者多选项）
				
			10.2. 操作属性名和默认属性值相同的属性. 
				如: selected（一般指下拉菜单选项）----- 默认选中
				
			10.3. 操作class属性
				属性名为:className  ------ 新增值的时候，会覆盖原来的类名，只有将原来的类名写入js中
				
			10.4. 操作style的属性
				如:background-color
				
			10.5. 操作readonly属性:readonly---readOnly
				readOnly	设置或返回文本域是否应是只读的。
				
			10.6. 操作disabled属性: disabled ---true 
			    disabled	设置或返回文本域是否应被禁用。
				
    
 -->
<!-- 
    1.屏幕对象
            1.1 availWidth	显示器屏幕可用宽度，除任务栏外
            1.2 availHeight	显示器屏幕可用高度，除任务栏外
            1.3 Width		显示器屏幕实际宽
            1.4 Height		显示器屏幕实际高
    2.navigator对象
        userAgent	返回由客户机发送服务器的 user-agent 头部的值。
    3.location对象
            1. hash		返回一个URL的锚部分 #以后的值
			2. href		设置和获取链接
			3. search	？以后的值
    4.history对象
				4.1 back()		返回到浏览器列表中当前页面之前的页面，与浏览器的“返回”功能相同
				4.2 forward()	前进到浏览器中当前页面之后的页面，与浏览器的“前进”按钮功能相同
				4.3 go(1)		访问浏览器列表中指定的页面，该方法接受一个参数。参数可正可负。
    5.html和body 节点
                5.1. document.documentElement
                            document.documentElement.clientHeight:它拿到的是整个窗口高度
                            
                5.2. document.body
                            document.body.clientHeight:拿到内容的高度
    6.节点列表
        文档中所有的内容都是一个节点，包括空格和换行
			1. firstChild	查找的是第一个子节点[包括换行]
			2. lastChild	查找的是最后一个子节点[包括换行]
			3. childNodes	查找的是所有子节点[包括换行]
			4. previousSibling	上一个兄弟节点
			5. nextSibling		下一个兄弟节点
			
			---------------------以下掌握----------------------
			6. parentNode	父级节点
			7. div.children 查找所有的子元素节点
    7.节点查询
            1. closest()
				查找距离最近的元素
				
			2. Element.nextElementSibling
				查找到的是下一个元素节点
			
			3. Element.previousElementSibling
				查找的是上一个元素节点
				
			4. removeChild---删除某个节点元素
			父级.removeChild(子节点对象);
    8.操作元素
            1. hasChildNodes()
				判断是否有元素子节点，返回布尔值【空格，和换行符都是节点】
			2. appendChild(node)
				添加元素节点--添加在元素的最后
			3. createElement(“元素名称”)
				创建元素节点
			4. removeChild(node)
				删除元素节点
			
			5. insertBefore(newnode, refnode)
				语法：
					父级元素对象.insertBefore(newnode,oldnode)
					newnode和oldnode必须是兄弟关系
					newnode添加在oldnode之前
				
			6. replaceChild(newnode, oldnode) ----了解
			
			7. cloneNode()
				node.cloneNode(deep)：deep:复制所有节点应该给一个true
				复制节点
    9.innerHTML和innerText
            1. innerHTML
				设置和获取HTML代码
			2. innerText
				设置和获取文本内容
    10.设置和获取属性值
            1. w3c属性值的获取和设置
				获取属性值:
		 			元素对象.属性名;
		 			元素对象["属性名"];
		 		设置属性值:
		 			元素对象.属性名=值;
		 			元素对象["属性名"]=值;
				
			2. 自定义属性值的获取和定义
				获取属性值:
		 			元素对象.getAttribute("属性名");
		 		设置属性值:
		 			元素对象.setAttribute("属性名",值);
    11.事件
            1. 什么是事件与事件处理函数
				事件：就是用户行为
				事件处理函数：对用户行为作出反应
				
			2. onload: 网页一打开时发生——准确点说，是网页加载完毕时发生



 -->
<!-- 
	1. 事件对象
            event
            兼容性写法：
                e = e||window.evnet;//【实际项目中直接先写】

			clientX: 鼠标在窗口中x轴的坐标
			clientY: 鼠标在窗口中Y轴的坐标
			pageX: 856
			pageY: 201
			offsetX: 856
			offsetY: 201
			
			screenX: 鼠标在屏幕中x轴的坐标
			screenY: 鼠标在屏幕中Y轴的坐标
			
			which: 鼠标的那个键，左键为：1，滚轮为：2，右键为：3
			type: 事件类型

	2.绑定事件---三种方式
        方法1：事件嵌套 -->
<!-- <button id="btn" onclick="fn()">点击</button> 
        <button id="btn">点击</button>
            function fn(){
                alert("绑定事件")
            }
            btn.onclick = fn ; //方法2  函数调用
            btn.onclick =function(){
                alert("方法3：绑定事件")
            }
    3.事件冒泡：
				阻止事件冒泡：stopPropagation
        
    4.正则表达式的定义
        4.1、new构造方式
            var r = new RegExp(“test”);

        4.2、字面量方式（推荐）
            var r = /test/;
        
        4.3. test()
            reg.test(str)//合法返回：true;不合法返回：false;
    5.正则表达式的修饰
            i	不去分大小写
			g	全局匹配
			m	多行匹配
    6.指定位置
				^	开头
				$	结尾
    7.匹配一类字符
            [abc]	查找方括号之间的任何字符。
			[^abc]	查找任何不在方括号之间的字符。
			[0-9]	查找任何从 0 至 9 的数字。
			[a-z]	查找任何从小写 a 到小写 z 的字符。
			[A-Z]	查找任何从大写 A 到大写 Z 的字符。
			[A-z]	查找任何从大写 A 到小写 z 的字符。
			(red|blue|green)	查找任何指定的选项。
			
			[adgk]	查找给定集合内的任何字符。
			[^adgk]	查找给定集合外的任何字符。
    8.元字符
    
			1）\w	查找单词字符  --- 字母||数字||_
			2）\W	查找非单词字符
			3）\d	查找数字
			4）\D	查找非数字字符
			5）.		查找单个字符，除了换行和行结束符。
    9.限定字符
            n+		匹配任何包含至少一个 n 的字符串。 		[1-∞)
			n*		匹配任何包含零个或多个 n 的字符串。		[0-∞]
			n?		匹配任何包含零个或一个 n 的字符串。 	[0-1]
			n{X}	匹配包含 X 个 n 的序列的字符串。	 	n重复x次
			n{X,Y}	匹配包含 X 或 Y 个 n 的序列的字符串。	n重复[X-Y]之间的次数
			n{X,}	匹配包含至少 X 个 n 的序列的字符串。	n重复[x-∞]
    10.分组
            var s = “AAA8888”;//关心字符中字母后面的数字；
			var re =/[a-z]+(\d+)/i;
			var arr = re.exec(s);
			arr[1] 
        
        -->

<!-- 
    1. 如何使用jquery
            1.1 使用何种版本
                pc上面一般使用	1.x  2.x 
            1.2 官网下载jQuery库
                
				
    2. 原生js和jQuery的对比
        原生js查找对象：
            var li = documet.getElementByTagName();
        jQuery查找对象：
            var li = $("li");
    3.选择器：
        语法：$("css选择器");nth-child();
        css选择器:
            .类名
            #idnname
            后代：e1 e2
            子代：e1>e2
            其他.......

    4.jquery 使用步骤：
        1. 引入jQuery库
        2. js代码
    5.设置样式：
            一个：
                $(".box ul li").css("color","#f0f")
            多个：
                $(".box ul li").css({
                    "color":"#f00",
                    "fontSize":"50px",
                    "background-color":"#ccc"
                })
            获取样式值：
                $(".box ul li").css("color")--获取样式值
    6.设置内容
            text() - 设置或获取元素的文本内容
                对"纯文本"进行操作
                
            html() - 设置或获取元素的内容（包括 HTML 标记）
                对"标签和文本"进行操作
                
            val() - 设置或获取表单字段的值
    7.添加元素
            1.1 添加子元素
                append() - 在被选元素的结尾插入内容  
                    append() - 在被选元素的结尾插入内容
                    语法：$("选择器").append(jQuery元素对象)；
                prepend() - 在被选元素的开头插入内容
            1.2 添加兄弟元素
                after() - 在被选元素之后插入内容
                before() - 在被选元素之前插入内容
    8.删除元素
				remove() - 删除被选元素（及其子元素）
                    $("选择器").remove()
				empty() - 从被选元素中删除子元素
                    empty() - 从被选元素中删除子元素
    9.原生元素对象-----jQuery元素对象
			var box1 = document.getElementsByClassName("box1");
			var box2 = $(".box1");
			console.log("元生",box1);
			console.log("jquery",box2);
		9.1 生转jQuery对象----jQuery对象只能使用jQuery方法，原生可以使用jQuery对象方法【原生转为jQuery对象】
			$(box1)//将原生转为了jquery对象
			console.log($(box1))
		9.2 query对象转原生----原生可以使用原生的方法和属性
			box2[0]
			console.log(box2[0])
    10.样式操作
				addClass() - 向被选元素添加一个或多个类     
                    语法：$("选择器").addClass("类名")--添加指定的类名
				removeClass() - 从被选元素删除一个或多个类
                    (1)$("选择器").removeClass()--清空类名
                    (2)删除指定的类名：$("选择器").removeClass("类名")
    11.	遍历
            11.1 父级
                parent()***
                    //parent()*** 	closest("祖先元素")***
                closest("祖先元素")***
            11.2 儿子
                children()*
                find()*****     语法：$("选择器").find("选择器")
                //children()*  find()***** 查找方式：父级往后代去查找
            
            11.3 兄弟
                siblings()*****
                    siblings()  --- 除开自己之外的所有兄弟元素
                next()*****
                    next()	--- 下一个兄弟
                prev()*****
                    prev()  -- 上一个兄弟
                
                ------以下了解------
                nextAll()
                prevAll()
                nextUntil()
                prevUntil()
            
            11.4 过滤
                first()*
                    first()---查找第一个元素
                last()*
                eq() *****
                    eq(索引值) 精确查找标签元素，索引值从0开始
    12. each()
			$(selector).each(function(index,element))
    13.index()	获取元素索引值
    14.事件委派：专门针对新增加的内容
			on()
			语法：$("父级元素").on("事件","子元素选择器",function (){})
			比如：$("table").on("click","tr td a",function () {
				alert(1111)
			})
			
			delegate()
			
			
			bind()
			live()

 DOM
 BOM
     <script>
       
        var obj= {
            name : "张三",
            age : "20",
            sex : "nan"
        }
    //对象转换成字符串
        //JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
    var str = JSON.stringify(obj);
        //字符串转换成对象
        //JSON.parse() 方法将数据转换为 JavaScript 对象。
        var obj1 =JSON.parse(str);
    </script>
    instanceof
        arguments 函数特有对象，是一个伪数组
    JavaScript 函数有个内置的对象 arguments 对象。

    argument 对象包含了函数调用的参数数组。
        定义构造函数<===>类

    function Fish(){//首字母必须大写
        this.属性名 ="";
        ....
        this.方法名 =functhion(){

        }
    }

    使用：
        var F=new Fish(参数)
        参数：arry obj

     对象参数
            function Cat(obj){
                this.name = obj.name;
                this.color = obj.color;
                this.age = obj.age
                this.juezhao = function(){
                    console.log(this.name + "打豆豆")
                }
            }
            var obj1 = {
                name: "小菊",
                color:"黄色",
                age:"3"
            }
            var f1=new Cat(obj1);
            console.log(f1.juezhao())
        基础参数
            function Cat(name ,color,age){
                this.name =name;
                this.color=color;
                this.age=age;
                this.show = function(){
                    console.log("我是" +this.name+ "今年"+this.age+"了喜欢干饭")
                }
            }
        var f1 = new Cat("小黄","黄色","15") 
       f1.show()
    注意：
        构造函数本质上还是函数,this指向window， new出对象后，指向对象
        构造函数里没有return语句
        属性和方法都赋值给了this
        首字母必须大写
    怎么解决方法过载?
            挂载方法到原型上面
            构造函数.prototype.方法名 = function(){}
    什么是原型?
          在js中任何一个函数都有一个prototype属性，原型(prototype)就是函数的一个属性，它指向一个对象。  
    new出的对象==>构造函数原型==>对象原型object
    JavaScript的所有function 类型的对象都有一个prototype属性
    proto出现在对象上, prototype出现在类/构造函数上, 对象上的__proto_实际上是对类的prototype进行引用（内存地址都一样）

    定义json
            var j = {
                "name":"张三"，
                "age":"18"
            }
            var obj = {//对象，字面量
				name:"李四",
				age:"22"
			}



    作用域链
        函数嵌套函数，进行变量的引用，就近原则 
        局部变量如果想在全局使用，只需要 将局部变量暴露到全局window.

        私有方法：函数内部的函数
        私有变量: 函数内部定义的变量
        全局变量：在全局进行变量提升
        局部变量：只在局部进行变量提升
        立即执行函数 IIFE
        匿名函数如何不报错？
        加， 减，！取反 ，括号（函数）
        注意：
            最好使用函数暴露到全局，不要使用变量暴露到全局；
        闭包语法：
            ；()；
            什么是闭包?
                闭包( closure)是一个函数在创建时允许函数内部操作函数外部的变量时所创建的作用域。闭包可以让函数访问所有的变量和函数，只要这些变量和函数存在于该函数声明时的做作用域内就行。


         回调函数:函数作为参数传递给函数
            function fn(a) {
				a()
			}
			var a = function () {
				console.log(1111)
			}
			fn(a)
			
			setTimeout(function () {
				
			},1000)       

 
    this
            函数中的this 未开启严格模式"use strict ===>指向window ，
                        开启严格模式"use strict ===>不会指向window 
                原则：谁调用，指向谁

            全局中的this ===>指向window
            对象中的this===>指向对象本身
            构造函数中的this==> 指向new创建的实例
            -->


<!-- VUE -->
<!-- 私有组件
        
        cnpm i axios -g ：安装 axios   

axios 优势:
        较高的活跃度（github）
        无任何依赖
        完善的功能
        支持并发请求
        受大牛技术人的推崇

github



             -->